#ifndef PARSEDDATA_H_
#define PARSEDDATA_H_

#include <string>
#include "parser/exceptions/InvalidDataException.h"
#include "util/LinkedList.h"

namespace parser {

/* @class ParsedData
 * Representacion de los datos parseados de un registro.
 *
 * Al parsear los datos de un registro, se pueden generar warnings. Estos son
 * errores corregibles y por lo tanto no deben interrumpir la ejecucion del
 * programa. Para eso ParsedData permite almacenar un listado de warnings
 * generados durante el parseo de este registro individual.
 */
class ParsedData {
public:
	/*
	 * Agrega un mensaje de warning al objeto
	 */
	ParsedData* addWarning(std::string message);
	/*
	 * Recupera el siguiente warning de la lista.
	 */
	std::string getNextWarning();
	virtual ~ParsedData() {
	}
	/*
	 * Devuelve si se generaron menasajes de error durante la carga.
	 */
	bool hasWarnings();
protected:
	util::LinkedList<std::string> warnings; // listado con los warnings ocurridos
};

class VertexParsedData: public ParsedData {
public:
	VertexParsedData();
	virtual ~VertexParsedData();

	// getters
	double getX();
	double getY();
	std::string getId();

	// setters
	VertexParsedData* setX(double x);
	VertexParsedData* setY(double y);
	VertexParsedData* setId(std::string id) throw (InvalidDataException);

private:
	double x; // posicion X del vertice
	double y; // posicion Y del vertice
	std::string id; // identificador del vertice
};

class EdgeParsedData: public ParsedData {
public:
	EdgeParsedData();
	virtual ~EdgeParsedData();

	// getters
	std::string getId();
	double getLength();
	double getMaxSpeed();
	std::string getIdO();
	std::string getIdD();

	// setters
	EdgeParsedData* setId(std::string id) throw (InvalidDataException);
	EdgeParsedData* setLength(double length);
	EdgeParsedData* setMaxSpeed(double maxSpeed) throw (InvalidDataException);
	EdgeParsedData* setIdO(std::string idO) throw (InvalidDataException);
	EdgeParsedData* setIdD(std::string idD) throw (InvalidDataException);

private:
	std::string id; // id de la arista
	double length; // longitud de la arista
	double maxSpeed; // velocidad maxima de la arista
	std::string idO; // identificador del vertice de origen
	std::string idD; // identificador del vertice de destino
};

} // end of namespace

#endif /* PARSEDDATA_H_ */
